﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Infrastructure.Data.Core;
using Cesave.Domain.PermisosModule.Contracts.CultivosFechas;
using Cesave.Infrastructure.Data.PermisosModule.Context;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Domain.Core.Specification;

namespace Cesave.Infrastructure.Data.PermisosModule.Repositories
{
    /// <summary>
    /// Implementación del repositorio de fechas de cultivo.
    /// </summary>
    public class CultivosFechaRepository
        : GenericRepositoryEx<CultivosFecha>, ICultivosFechaRepository
    {
        #region Constructor

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="traceManager"></param>
        public CultivosFechaRepository(IPermisosModuleContext context, ITraceManager traceManager)
            : base(context, traceManager)
        {
        }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cultivoSpecification"></param>
        /// <param name="cicloSpecification"></param>
        /// <param name="juntaSpecification"></param>
        /// <returns></returns>
        public IEnumerable<CultivosFecha> FindCultivosFechasByCultivoAndCicloAndJunta(CultivosFechasByCultivoSpecification cultivoSpecification, CultivosFechasByCicloSpecification cicloSpecification, CultivosFechasByJuntaSpecification juntaSpecification)
        {
            if (cultivoSpecification == null)
                throw new ArgumentNullException();
            if (cicloSpecification == null)
                throw new ArgumentNullException();
            if (juntaSpecification == null)
                throw new ArgumentNullException();
            Specification<CultivosFecha> specification = new TrueSpecification<CultivosFecha>();
            specification &= cultivoSpecification;
            specification &= cicloSpecification;
            specification &= juntaSpecification;
            return GetBySpec(specification).OrderBy(f => f.InicioDeSiembra);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cultivoSpecification"></param>
        /// <param name="cicloSpecification"></param>
        /// <param name="juntaSpecification"></param>
        /// <param name="fromDate"></param>
        /// <param name="toDate"></param>
        /// <returns></returns>
        public IEnumerable<CultivosFecha> FindCultivosFechasForExpedicion(CultivosFechasByCultivoSpecification cultivoSpecification, CultivosFechasByCicloSpecification cicloSpecification, CultivosFechasByJuntaSpecification juntaSpecification, DateTime fromDate, DateTime toDate)
        {
            if (cultivoSpecification == null)
                throw new ArgumentNullException();
            if (cicloSpecification == null)
                throw new ArgumentNullException();
            if (juntaSpecification == null)
                throw new ArgumentNullException();
            Specification<CultivosFecha> specification = new TrueSpecification<CultivosFecha>();
            specification &= cultivoSpecification;
            specification &= cicloSpecification;
            specification &= juntaSpecification;
            specification &= new CultivosFechasByDateRangeSpecification(fromDate, toDate);
            return GetBySpec(specification).OrderBy(f => f.InicioDeSiembra);
        }
    }
}
